/**
 * Dialog
 * author: H.R
 * 20191221
 * from popups.js
 */

/* 自定义封装 S */
/**
 * alert 提示对话框
 * @param string content 提示框的内容
 * @param object params 当params参数为一个函数时》特殊场景用于》执行成功的回调函数
 *               params.title 提示框的标题
 *               params.yesfn 点击确认按钮时执行回调函数
 *               params.yestext 确认按钮的文字
 * 示例1：myalert('我是内容');
 * 示例2：myalert('我是内容',function(){ mytoast('点击确认后执行我！'); });
 * 示例3：myalert('我是内容！',{title:'我是标题',yestext:'确认提交',yesfn:function(){ myalert('我是回调函数！'); }});
 */
function myalert(content, params){
    content = content || '';
    params = params || '';
    //获得提示框的标题文字
    var title = (params.title!=undefined)?params.title:'提示';
    //如果params为一个函数时，特殊场景用法》执行成功的回调函数
    if($.isFunction(params))
        var yesfn = params;
    //确认按钮点击后的回调函数
    else
        var yesfn = (params.yesfn!=undefined)?params.yesfn:'';
    //确定按钮的文字
    var yestext = (params.yestext!=undefined)?params.yestext:'确认';
    //调用执行函数
    myDialog({
        title:   title,    //标题
        content: content,  //内容
        yesfn:   yesfn,    //点击确认按钮的回调函数
        yestext: yestext,  //确认按钮的文字
    })
}

/**
 * confirm 是否确认对话框
 * @param string content 提示框的内容
 * @param object params 当params参数为一个函数时》特殊场景用于》执行成功的回调函数
 *               params.title 提示框的标题
 *               params.yesfn 点击确认按钮时执行回调函数
 *               params.nofn 点击取消按钮时执行回调函数
 *               params.yestext 确认按钮的文字
 *               params.notext 取消按钮的文字
 * 示例4: myconfirm('确认要删除吗？');
 * 示例5: myconfirm('确认要删除吗？',function(){ mytoast('点击确认后执行我！'); });
 * 示例6: myconfirm('确认要删除吗？',{title:'我是标题',yestext:'确认',notext:'取消',
            yesfn:function(){ mytoast('我点击了确认！'); },
            nofn:function() { mytoast('我点击了取消！'); }
          });
 */
function myconfirm(content, params){
    content = content || '';
    params = params || '';
    //获得提示框的标题文字
    var title = (params.title!=undefined)?params.title:'提示';
    //如果params为一个函数时，特殊场景用法》执行成功的回调函数
    if($.isFunction(params))
        var yesfn = params;
    //确认按钮点击后的回调函数
    else
        var yesfn = (params.yesfn!=undefined)?params.yesfn:'';
    //取消按钮点击后的回调函数
    var nofn = (params.nofn!=undefined)?params.nofn:'';
    //确定按钮的文字
    var yestext = (params.yestext!=undefined)?params.yestext:'确认';
    //取消按钮的文字
    var notext = (params.notext!=undefined)?params.notext:'取消';
    //调用执行函数
    myDialog({
        title:   title,    //标题
        content: content,  //内容
        yesfn:   yesfn,    //点击确认按钮的回调函数
        nofn:    nofn,     //点击取消按钮的回调函数
        yestext: yestext,  //确认按钮的文字
        notext:  notext    //取消按钮的文字
    })
}

/**
 * prompt 输入对话框
 * @param string content 提示框的提示内容
 * @param object params 当params参数为一个函数时》特殊场景用于》执行成功的回调函数
 *               params.title 提示框的标题
 *               params.yesfn 点击确认按钮时执行回调函数
 *               params.nofn 点击取消按钮时执行回调函数
 *               params.yestext 确认按钮的文字
 *               params.notext 取消按钮的文字
 *               params.placeholder input的placeholder文字提示
 *               params.default input的默认值(仅用于prompt)
 *               params.type input框的type类型，当为password时为密码输入框
 * 示例7: myprompt('确认要删除吗？');
 * 示例8: myprompt('确认要删除吗？',function(){ mytoast('点击确认后执行我！'); });
 * 示例9: myprompt('请输入姓名：',{type:'password',title:'我是标题2',default:'input的默认值',yestext:'确认',notext:'取消',placeholder:'请输入姓名...',
            yesfn:function(result){ if(result) myalert('您输入的内容为：'+result); else myalert('您未输入任何内容！'); },
            nofn:function() { myalert('我点击了取消！'); }
          });
 */
function myprompt(content, params){
    content = content || '';
    params = params || '';
    //获得提示框的标题文字
    var title = (params.title!=undefined)?params.title:'提示';
    //如果params为一个函数时，特殊场景用法》执行成功的回调函数
    if($.isFunction(params))
        var yesfn = params;
    //确认按钮点击后的回调函数
    else
        var yesfn = (params.yesfn!=undefined)?params.yesfn:'';
    //取消按钮点击后的回调函数
    var nofn = (params.nofn!=undefined)?params.nofn:'';
    //确定按钮的文字
    var yestext = (params.yestext!=undefined)?params.yestext:'确认';
    //取消按钮的文字
    var notext = (params.notext!=undefined)?params.notext:'取消';
    //input的placeholder文字提示
    var placeholder = (params.placeholder!=undefined)?params.placeholder:'请输入...';
    //input的默认值
    var defaultValue = (params.default!=undefined)?params.default:'';
    //input框的type类型，当为password时为密码输入框
    var type = (params.type!=undefined)?params.type:'';
    //调用执行函数
    myDialog({
        title:   title,    //标题
        prompt:  content,  //输入对话框的文字提示内容
        yesfn:   yesfn,    //点击确认按钮的回调函数
        nofn:    nofn,     //点击取消按钮的回调函数
        yestext: yestext,  //确认按钮的文字
        notext:  notext,    //取消按钮的文字
        placeholder: placeholder, //input的placeholder文字提示
        defaultValue: defaultValue, //input的默认值
        type: type //input框的type类型，当为password时为密码输入框
    })
}

/**
 * toast 弹出提示
 * @param string content 提示文字内容
 * @param string params/params.second 停留时间时长，当params值为整数时特殊作用于时长参数 (单位毫秒，默认值2000)
 *               params.yesfn 定时器显示内容结束，然后调用回调函数
 * 示例10： mytoast('我默认显示2秒');
 * 示例11： mytoast('自定义显示3秒',3000);
 * 示例12： mytoast('我默认显示2秒',function(){ mytoast('2秒后执行我!'); });
 * 示例13： mytoast('自定义显示5秒',{second:5000});
 * 示例14： mytoast('自定义5秒后，执行回调函数!',{second:5000, yesfn:function(){ mytoast('hello我将显示2秒'); }});
 */
function mytoast(content, params) {
    content = content || '';
    params = params || '';
    //初始化content,当值为空时显示为null
    var content = content?content:'null';
    //停留时间时长，当params值为整数时特殊作用于时长参数 (单位毫秒，默认值1000)
    if($.isNumeric(params) && params>0)//当params值为整数时特殊作用于时长参数
        second = params;
    else if(params.second!=undefined && params.second>0)//params为空时，设置默认值2000
        second = params.second
    else
        second = 2000;
    //如果params为一个函数时，特殊场景用法》执行成功的回调函数
    if($.isFunction(params))
        params.yesfn = params;
    //确认按钮点击后的回调函数
    else
        params.yesfn = (params.yesfn!=undefined && $.isFunction(params.yesfn))?params.yesfn:'';
    //组合html
    var html = '';
    html += '<div class="jq-toast" style="display: none;">';
    html +='<div class="toast">'+content+'</div></div>';
    $('body').append(html);
    if(content!='null')
    	$('.jq-toast').fadeIn();
    //定时器显示内容
    setTimeout(function () {
        $('.jq-toast').fadeOut(function () {
            $(this).remove();
        });
        //有回调函数时
        if($.isFunction(params.yesfn)){
            params.yesfn();
        }
        //清空初始化content变量内容
        content = '';
    },second);
}
/* 自定义封装 E */

/**
 * alert弹出层(包括：alert/confirm/prompt)
 * @param object param.title 提示框的标题
 *               param.content 提示文字内容
 *               param.prompt 输入对话框的内容（有此参数时param.content将无效）
 *               param.yesfn 点击确认按钮时执行回调函数
 *               params.nofn 点击取消按钮时执行回调函数
 *               param.yestext 确认按钮的文字
 *               param.notext 取消按钮的文字
 *               param.nolink 取消按钮的超链接
 *               param.yeslink 取消按钮的超链接
 *               param.placeholder 输入框input的placeholder文字提示(仅用于prompt)
 *               params.defaultValue input的默认值(仅用于prompt)
 *               param.click_bg 点击遮罩时，是否关闭弹窗 默认点击遮罩不关闭弹窗
 */
var myDialog_number = 0;//记录当前页面进程打开窗口的数量序号
function myDialog(param) {
    param = param || '';
    myDialog_number++;
    var title = param.title,
        content = param.content,
        yesfn = param.yesfn,
        nofn = param.nofn,
        yestext = param.yestext,
        notext = param.notext,
        nolink = param.nolink,
        yeslink = param.yeslink,
        prompt = param.prompt,
        placeholder = param.placeholder,//input的placeholder文字提示（仅prompt 输入对话框专有）
        defaultValue = param.defaultValue,//input的默认值（仅prompt 输入对话框专有）
        click_bg = param.click_bg;
        type = param.type;//input框的type类型，当为password时为密码输入框
    //点击遮罩时，是否关闭弹窗 默认点击遮罩不关闭弹窗
    if (click_bg === undefined){
        click_bg = false;
    }
    if (!nolink){
        nolink = 'javascript:void(0);';
    }
    if (!yeslink){
        yeslink = 'javascript:void(0);';
    }

    var html = '';
    html +='<div class="jq-alert" id="jq-alert-'+myDialog_number+'"><div class="alert">';
    
    //标题
    if(title) html+='<h2 class="title">'+title+'</h2>';

    //输入对话框时
    if (prompt){
        type = (type=='password')?'type="password"':'type="text"';
        html += '<div class="alert_content"><div class="prompt">';
        html += '<p class="prompt-content">'+prompt+'</p>';
        html += '<input '+type+' class="prompt-text" value="'+defaultValue+'" placeholder="'+placeholder+'"></div>';
        html += '</div>';
    }
    //非输入对话框时
    else {
        html+='<div class="alert_content">'+content+'</div>';
    }

    //没有取消按钮时，只显示确认按钮
    if (!notext){
        html+='<div class="fd-btn"><a href="'+yeslink+'" class="confirm_btn yes_btn">'+yestext+'</a></div>'
        html+='</div>';
    }
    //同时显示两个按钮：确认/取消
    else {
        html+='<div class="fd-btn">'+
            '<a href="'+yeslink+'" class="confirm_btn yes_btn">'+yestext+'</a>'+
            '<a href="'+nolink+'"  data-role="cancel" class="cancel_btn">'+notext+'</a>'+
            '</div>';
        html+='</div>';
    }

    //将弹窗的div内容append到body里
    $('body').append(html);
    //当前弹窗对象
    var ele = '#jq-alert-'+myDialog_number;
    //添加动画class, 动画显示弹窗
    $('body '+ele).addClass('in');
    //输入对话框时，input光标选中
    if (prompt)
        $(ele).find('.prompt-text').focus();
    //点取消按钮时触发
    $(ele).on('click','.cancel_btn',function () {
        if (nofn){
            param.nofn();
            nofn = '';
        }
        //执行关闭弹窗操作
        close_myDialog(this);
        //重置变量
        param = {};
    });

    //弹窗窗体被点击时
    $(document).on('click', ele+' .alert',function (event) {
        event.stopPropagation();
    });

    //点击确认按钮时触发
    $(document).on('click', ele+' .yes_btn',function () {
        //有回调函数时
        if($.isFunction(yesfn)){
            //输入对话框时，需要将当前输入的值传递到回调函数
            if(prompt)
                param.yesfn($(ele).find('.prompt-text').val());
            //有yesfn函数时
            else
                param.yesfn();
        }
        //执行关闭弹窗操作
        close_myDialog(this);
        param = {};
    });

    //键盘按钮快捷键
    $(document).keydown(function(e){
        //空格或回车键按下时，触发回车
        if (e.keyCode == 32 || e.keyCode==13) {
            $(ele+' .yes_btn').trigger("click");
            return false;
        }
        //按下esc键时，取消
        if (e.keyCode == 27) {
            //有取消按钮时，按esc键触发点击取消按钮
            if($(ele+' .cancel_btn').length>0)
                $(ele+' .cancel_btn').trigger("click");
            //无取消按钮时，执行关闭弹窗操作
            else
                close_myDialog($(ele+' .yes_btn'));
            return false;
        }
    });

    //点击遮罩时，是否关闭弹窗
    if(click_bg === true){
        $(document).on('click', ele,function () {
            //执行关闭弹窗操作
            close_myDialog(this);
            //重置相关变量
            yesfn ='';
            nofn = '';
            param = {};
        });
    }

}

/**
 * 关闭弹窗
 */
function close_myDialog(_this){
    _this = _this || '';
    //只定位当前的弹窗对象
    var obj = $(_this).parents('.jq-alert');
    //添加动画class, 动画关闭隐藏弹窗
    //obj.addClass('out');//隐藏提示框时设置动画
    //setTimeout(function () {//为了配合动画，需要设置延时
	//移除 div.jq-alert
    obj.remove();//只移除带.out的
    //},500);
}